package vista;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.ImageIcon;
import javax.swing.JButton;

import modeloCarmenSanDiego.Ciudad;
import modeloCarmenSanDiego.Juego;
import modeloCarmenSanDiego.edificios.Edificio;
import controlador.BotonCargarListener;
import controlador.BotonDestinoCiudadListener;
import controlador.BotonEdificioListener;
import controlador.BotonNuevoJListener;
import controlador.BotonSalirListener;

public class PanelCentral extends Paneles {

	ImageIcon imagen;
	private Clip intro;
	@SuppressWarnings("unused")
	private boolean playing;
	JButton botonIniciarJ = new JButton ("Juego Nuevo");
	JButton botonCargarJ = new JButton ("Cargar Juego");
	JButton botonSalir = new JButton ("Salir");
	
	List<JButton> botonesEdificio = new ArrayList<JButton>();
	List<JButton> botonesDestino = new ArrayList<JButton>();
	
	private static final long serialVersionUID = 1L;
	private static final int edificiosPorCiudad = 3;
	private static final int destinosPorCiudad = 3;
	
	public PanelCentral(Ventana ventana) {
		super(ventana, "/imagenes/algo-thief.jpg");	

		setLayout(new GridBagLayout());
		this.iniciarSonido();
		
		GridBagConstraints gbc = new GridBagConstraints();
		
		gbc.insets = new Insets (10,10,10,10);
		
		gbc.gridx=1;
		gbc.gridy=0;
		this.add(botonIniciarJ,gbc);
		gbc.gridx=1;
		gbc.gridy=1;
		this.add(botonCargarJ,gbc);
		gbc.gridx=1;
		gbc.gridy=2;
		this.add(botonSalir,gbc);
		
		gbc.insets = new Insets (10,180,10,10);
		
		this.cargarBotones();
		
		gbc.gridx=0;
		gbc.gridy=0;
		this.add(this.botonesEdificio.get(1),gbc);
		this.add(this.botonesDestino.get(0),gbc);
		gbc.insets = new Insets (10,10,10,10);
		gbc.gridx=1;
		gbc.gridy=0;
		this.add(this.botonesEdificio.get(0),gbc);
		this.add(this.botonesDestino.get(1),gbc);
		gbc.gridx=2;
		gbc.gridy=0;
		this.add(this.botonesEdificio.get(2),gbc);
		this.add(this.botonesDestino.get(2),gbc);
		
		
	}

	private void cargarBotones() {
		for (int cont = 0; cont < edificiosPorCiudad; cont++){
			this.botonesEdificio.add(new JButton(""));
		}
		// Estan separados por si en un futuro queremos poner mas botones de uno que de otro.
		for (int cont = 0; cont < destinosPorCiudad; cont++){
			this.botonesDestino.add(new JButton(""));
		}
		
	}

	public void cambiarVisibilidadAMenuPrincipal() {
		this.setearVisibilidadBotonesMenu(true);
		this.setearVisibilidadBotonesDestinos(false);
		this.setearVisibilidadBotonesEdificio(false);
	}

	public void cambiarVisibilidadAComisaria() {
		this.setearImagenDeFondo("/imagenes/pantalla_negra.jpg");
		this.setOpaque(true);
		this.setearVisibilidadBotonesMenu(false);
		this.setearVisibilidadBotonesDestinos(false);
		this.setearVisibilidadBotonesEdificio(false);		
	}

	public void cambiarVisibilidadACiudad() {
		this.setearImagenDeFondo("/imagenes/edificios.jpg");
		this.detenerSonido();
		this.setearVisibilidadBotonesMenu(false);
		this.setearVisibilidadBotonesDestinos(false);
		this.setearVisibilidadBotonesEdificio(true);
	}

	public void cambiarVisibilidadADestinos() {
		this.setearImagenDeFondo("/imagenes/Mapamundi_quebec.png");
		this.setearVisibilidadBotonesMenu(false);
		this.setearVisibilidadBotonesDestinos(true);
		this.setearVisibilidadBotonesEdificio(false);
	}
	
	private void setearVisibilidadBotonesDestinos(boolean bool){
		for (JButton boton : botonesDestino){
			boton.setVisible(bool);
		}
	}
	
	private void setearVisibilidadBotonesEdificio(boolean bool){
		for (JButton boton : botonesEdificio){
			boton.setVisible(bool);
		}
	}
	
	private void setearVisibilidadBotonesMenu(boolean bool) {
		this.botonCargarJ.setVisible(bool);
		this.botonIniciarJ.setVisible(bool);
		this.botonSalir.setVisible(bool);
	}

	public void actualizarDestinos(List<Ciudad> destinos) {
		for (int cont = 0; cont < destinosPorCiudad; cont++){
			botonesDestino.get(cont).setText(destinos.get(cont).getNombre());
		}
	}

	public void actualizarEdificios(List<Edificio> edificios) {
		for (int cont = 0; cont < edificiosPorCiudad; cont++){
			botonesEdificio.get(cont).setText(edificios.get(cont).getNombre());
		}
	}
	
	
	
	// LISTENERS
	
	public void addBotonEdificioListener(Juego juego) {
		for(int x=0; x<botonesEdificio.size(); x++){
			JButton boton = botonesEdificio.get(x);
			boton.addActionListener(new BotonEdificioListener(ventana, juego, x));
		}
	}

	public void addBotonDestinoListener(Juego juego) {
		for(int x=0; x<botonesDestino.size(); x++){
			JButton boton = botonesDestino.get(x);
			boton.addActionListener(new BotonDestinoCiudadListener(ventana, juego, x));
		}
	}
		
	public void addBotonCargarListener(BotonCargarListener botonCargarListener) {
		botonCargarJ.addActionListener(botonCargarListener);
	}
	
	public void addBotonNuevoJListener(BotonNuevoJListener botonNuevoJ) {
		botonIniciarJ.addActionListener(botonNuevoJ);
	}
	
	public void addBotonSalirListener(BotonSalirListener botonSalirListener) {
		botonSalir.addActionListener(botonSalirListener);
	}
	
	// FIN LISTENERS
	
	
	public void iniciarSonido(){
			
		try {
			// Open an audio input stream.
			File soundFile = new File("src/sonidos/intro.wav");
		    AudioInputStream stream = AudioSystem.getAudioInputStream(soundFile);
		    // Get a sound clip resource.
		    this.intro = AudioSystem.getClip();
		    // Open audio clip and load samples from the audio input stream.
		    intro.open(stream);
		    playing = true;
		    intro.loop(Clip.LOOP_CONTINUOUSLY);
		    }
		catch (UnsupportedAudioFileException e) { e.printStackTrace(); }
		catch (IOException e) { e.printStackTrace(); }
		catch (LineUnavailableException e) { e.printStackTrace(); }
		}
	
	public void detenerSonido(){
		playing = false;
		try { intro.stop(); }
		catch ( Exception e ) {}
	}

}
